目錄
x = int(input("請輸入一個整數: "))
if x < 0:
x = 0
print('負數改為 0')
elif x == 0:
print('0')
elif x == 1:
print('1')
else:
print('比 1 大')
可以有零個或多個 elif 部分,以及一個可選的 else 部分。 關鍵字 'elif' 是 'else if' 的縮寫,適合用於避免過多的縮進。 一個 if ... elif ... elif ... 序列可以看作是其他語言中的 switch 或 case 語句的替代,在 Python 中是沒有 Switch/Case 語句的。
Python 中的 for 語句與 C 或 Pascal 中可能用到的有所不同。 Python 中的 for 語句並不總是對算術遞增的數值進行疊代(如同 Pascal),或是給予用戶定義疊代步驟和暫停條件的能力(如同 C),而是對任意序列進行疊代(例如列表或字符串),內容的疊代順序與它們在序列中出現的順序一致;利用 enumerate() 內建函數遍歷並獲取元素和對應索引;Python 的強大特性之一是其對列表的解析,它提供一種緊湊的方法,可以通過對列表中的每個元素應用一個函數,從而將一個列表映射為另一個列表。
words = ['cat', 'window', 'defenestrate']
# 對任意序列進行疊代
for w in words:
print(w, len(w))
# 遍歷並獲取元素和對應索引
for w in enumerate(words):
print(w)
# 列表映射
newwords = [word*2 for word in words]
print(newwords)
dic = {"program":"Python", "database":"mysql"}
#利用列表映射取出鍵
keys = [k for k, v in dic.items()]
print(keys)
如果在循環內需要修改序列中的值(比如重複某些選中的元素),推薦先拷貝一份副本。對序列進行循環不代表製作了一個副本進行操作。切片操作使這件事非常簡單:
words = ['cat', 'window', 'defenestrate']
for w in words[:]:
if len(w) > 6:
words.insert(0, w)
print(words)
如果寫成 for w in words: ,這個範例就會新增無限長的列表,一次又一次重複地插入 defenestrate。
可以根據 while 後面的判斷是來決定何時離開迴圈,以下範例就是利用輾轉相除法,逐次用較小數去除較大數的餘數,直到餘數是 0 為止。那麼,最後一個除數就是所求的最大公約數,所以判斷結束的條件就是餘數為 0 。
a, b = map(int, input("請輸入兩個整數: ").split())
if (b > a): # 確保 a > b
a, b = b, a
while (a % b):
a, b = b, (a % b)
print("最大公約數為", b)
如果需要遍歷一個數字序列,內建函數 range() 會派上用場。它生成算術級數,給定的終止數值並不在要生成的序列里。range也可以以另一個數字開頭,或者以指定的幅度增加(甚至是負數;有時這也被叫做 '步進')
# 算術級數: 0, 1, 2, 3, 4
for i in range(5):
print(i)
# 步進 0, 3, 6, 9
for i in range(0, 10, 3)
print(i)
# 負數步進 -10, -40, -70
for i in range(-10, -100, -30)
print(i)
如果你只打印 range,會出現奇怪的結果:
>>> print(range(10))
range(0, 10)
range() 所返回的對象在許多方面表現得像一個列表,但實際上卻並不是。此對象會在你疊代它時基於所希望的序列返回連續的項,但它沒有真正生成列表,這樣就能節省空間。函數 list() 是從可疊代對象中新增列表。
>>> list(range(5))
[0, 1, 2, 3, 4]
break 語句,和 C 中的類似,用於跳出最近的 for 或 while 循環,循環語句可能帶有一個 else 子句;它會在循環遍歷完列表 (使用 for) 或是在條件變為假 (使用 while) 的時候被執行,但是不會在循環被 break 語句終止時被執行。 這可以通過以下搜索質數 (prime number) 的循環為例來進行說明:
for n in range(2, 10):
for x in range(2, n):
if n % x == 0: # 可被整除,所以非質數
print(n, ' 可被整除,不是質數')
break
else:
print(n, ' 是質數')
---------------------------------------
# 輸出結果如下:
2 是質數
3 是質數
4 可被整除,不是質數
5 是質數
6 可被整除,不是質數
7 是質數
8 可被整除,不是質數
9 可被整除,不是質數
(仔細看: else 子句屬於 for 循環, 不屬於 if 語句。)
continue 語句表示繼續循環中的下一次疊代:
for num in range(2, 10):
if num % 2 == 0:
print("找到一個偶數", num)
continue
print("找到一個奇數", num)
---------------------------------------
# 輸出結果如下:
找到一個偶數 2
找到一個奇數 3
找到一個偶數 4
找到一個奇數 5
找到一個偶數 6
找到一個奇數 7
找到一個偶數 8
找到一個奇數 9
pass 語句什麼也不做。當語法上需要一個語句,但程序需要什麼動作也不做時,可以使用它。例如:
>>>
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
執行 Python 程式的時候,透過「例外處理」的機制,能夠在發生錯誤時進行對應的動作,不僅能保護整個程式的流程,也能夠掌握問題出現的位置,馬上進行修正。
使用 try, except, else 和 finally,try 區塊中的程式碼是要進行保護 ( 或測試 ),如果發生錯誤時會進入到 except 區塊,如果正常執行則進入到 else 區塊,不管是發生錯誤與否,最終都會進入 finally區塊。
下方的例子是希望用戶輸入一個整數n,並對整數n加1,儲存到s中,並印出結果。但是,如果用戶輸入文字串,則會發生無法轉換為整數的錯誤,因此發生錯誤,進而造成錯誤發生。
try: # 使用 try,測試內容是否正確
n = int(input('輸入數字n:'))
s = n + 1
except Exception as err: # 如果 try 的內容發生錯誤,就執行 except 裡的內容
print('發生格式錯誤',err)
print('錯誤類型', type(err))
else:
print(f'數字n = {n}, 加 1 後為 {s}')
finally:
print('一定會印出來的一段話')
--------------------------------------
# 輸出結果如下:
輸入數字n:10
數字n = 10, 加 1 後為 11
一定會印出來的一段話
或是
輸入數字n:a
發生格式錯誤 invalid literal for int() with base 10: 'a'
錯誤類型 <class 'ValueError'>
一定會印出來的一段話
如上所示,except 的錯誤資訊會根據不同的情況而有所不同,以下列出常見的幾種錯誤資訊,詳細錯誤資訊參考 Built-in Exceptions
錯誤資訊 | 說明 |
---|---|
NameError | 使用沒有被定義的對象 |
IndexError | 索引值超過了序列的大小 |
TypeError | 數據類型 ( type ) 錯誤 |
SyntaxError | Python 語法規則錯誤 |
ValueError | 傳入值錯誤 |
KeyboardInterrupt | 當程式被手動強制中止 |
AssertionError | 程式 asset 後面的條件不成立 |
KeyError | 鍵發生錯誤 |
ZeroDivisionError | 除以 0 |
AttributeError | 使用不存在的屬性 |
IndentationError | Python 語法錯誤 ( 沒有對齊 ) |
IOError | Input/output異常 |
UnboundLocalError | 區域變數和全域變數發生重複或錯誤 |
所以程式可以改為針對不同錯誤,給予不同的錯誤提示,如下所示
try: # 使用 try,測試內容是否正確
n = int(input('輸入數字n:'))
s = n + 1
except ValueError:
print('不可輸入整數以外的值')
except Exception as err: # 如果 try 的內容發生錯誤,就執行 except 裡的內容
print('發生格式錯誤',err)
print('錯誤類型', type(err))
else:
print(f'數字n = {n}, 加 1 後為 {s}')
finally:
print('一定會印出來的一段話')
---------------------------------------
# 輸出結果如下:
輸入數字n:a
不可輸入整數以外的值
一定會印出來的一段話